iT邦幫忙

2023 iThome 鐵人賽

0
自我挑戰組

Django系列 第 29

Day29~Django 漫漫長路-DRF API 匯出 excel文檔

  • 分享至 

  • xImage
  •  

大家好,我是Leo
首先抱歉上一篇標題打錯了
應該是openapi才對
今天來介紹的是如何製作api匯出excel檔案/images/emoticon/emoticon12.gif
OK~~~ Let's go now!!!


前言

假設我們今天擁有動物的data資料,想要每天透過api生成excel
excel需要製作兩個分頁,分別是老年,幼年
假設物種為kitty and puppy的分別在excel內要框出不同顏色
我們該如何設計API呢?
希望透過API,一鍵產出表格
就讓我們繼續看下去唄


views.py

import pandas as pd
from rest_framework import generics, permissions
import datetime
from django.http import HttpResponse
from django.utils.encoding import escape_uri_path
try:
    from io import BytesIO as IO # for modern python
except ImportError:
    from io import StringIO as IO # for legacy python

class ToExcel(generics.GenericAPIView):
    permission_classes = (permissions.AllowAny,)
    authentication_classes = []
    serializer_class = DataSerializer

    def get(self, request):
        df = pd.DataFrame(Data.objects.all().values('A','B','C'))
        # 分為老年與幼年
        df_young = df[(df['A']<10)]
        df_old = df[(df['A']>=10)]

        df_old = pd.DataFrame(list(df_old.T.to_dict().values()))

        #在異常裡面出現kitty 在excel內列表成紅色
        #在異常裡面出現puppy 在excel內列表成紫色
        reds = []
        purples = []
        for i,not_normal in enumerate(df_old.iteritems()):
            if not_normal[1] == 'kitty':
                purples.append(i)
            elif not_normal[1] == 'puppy':
                reds.append(i)

        # 上面定義的紫色紅色在下面生成至excel內
        df_old = df_old.style.set_properties(subset=pd.IndexSlice[reds, :], **{'color': 'red'}) \
            .set_properties(subset=pd.IndexSlice[purples, :], **{'color': 'purple'})

        excel_file = IO()
        writer = pd.ExcelWriter(excel_file,engine='xlsxwriter')

        df_young.to_excel(writer, sheet_name='幼年', index=False)
        df_old.to_excel(writer, sheet_name='老年', index=False)

        writer.save()
        excel_file.seek(0)

        year,month,day =datetime.datetime.today().strftime("%Y-%m-%d").split('-')

        filename = f"{year}年{month}月{day}日kitty與puppy.xlsx"
        response = HttpResponse(
            excel_file,
            content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
        )
        response['Content-Disposition'] = f"attachment; filename={escape_uri_path(filename)}"
        return response

url.py and serializer and model 在這邊就不在重複設定了
可以依照自己的model,製作serializer,在設定自己的url
透過get method,當使用者點下按鈕呼叫get method function
可以下載相對應的excel文件檔
是不是很有趣....../images/emoticon/emoticon02.gif


今天講解api製作 get method 產出excel文件檔
明天終於來到最後一篇的貼文了
說真的每天要po文真的不容易啊
希望有機會再挑戰,有興趣的議題
明天準備講解一下django的運用模式
我們明天見,各位掰掰~~~/images/emoticon/emoticon08.gif


上一篇
Day28~Django 漫漫長路-openai swagger 與 DRF
下一篇
Day30~Django 漫漫長路-踏上了第三十篇~~
系列文
Django30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言